var express = require('express');
var router = express.Router();

const sql = require("../sql/sql");
const cart = require("../sql/cart");
const pro = require("../sql/pro");
const tools = require("../tools/index");
const uuid = require("node-uuid");


/**
* @apiGroup 购物车
* @api {get} /api/cart 获取购物车数据
* @apiVersion 0.0.0
* @apiDescription 根据用户id，获取购物车数据
* @apiParam {String} userId 要查询的用户Id
* @apiParam {String} token 后端的登录状态token
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    state:201,
    title:"读取成功,没有数据",
    data:"NOT DATA"
})
res.send({
    state:200,
    title:"读取成功",
    data:data[0]
})
res.send({
    state: 10086,
    title: "登录信息已失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart
*/

// 获取购物车数据
router.get('/', function(req, res, next) {
    const userId = req.query.userId;
    const token = req.headers.token;

    tools.verify(token).then(tokenData => {
        sql.find(cart,{userId}, {_id:0,__v:0}).then(data=>{
            if(data.length < 1){
                res.send({
                    state:201,
                    title:"读取成功,没有数据",
                    data:"NOT DATA"
                })
            }else{
                res.send({
                    state:200,
                    title:"读取成功",
                    data:data[0]
                })
            }
        })
    }).catch((err)=>{
        res.send({
            state: 10086,
            title: "登录信息已失效，请重新登录",
            data: err
        })
    })
});



/**
* @apiGroup 购物车
* @api {post} /api/cart/add 添加购物车数据
* @apiVersion 0.0.0
* @apiDescription 根据用户id，将商品id对应的数据存储到购物车
* @apiParam {String} userId 要查询的用户Id
* @apiParam {String} proId 要添加的商品的Id
* @apiParam {String} token 后端的登录状态token
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    state:200,
    title:"第一次插入成功"
})
res.send({
    state:200,
    title:"存储成功，更新数据成功"
})
res.send({
    state:200,
    title:"读取成功",
    data:data[0]
})
res.send({
    state: 10086,
    title: "登录信息已失效，请重新登录",
    data: err
})
res.send({
    state:201,
    title:"商品不存在"
})
res.send({
    state:10086,
    title:"登录信息已失效，请重新登录"
})
* @apiSampleRequest http://localhost:3000/api/cart/add
*/

// 加入购物车
router.post('/add', function(req, res, next) {
    // 用户id，商品id，token
    const userId = req.body.userId
    const proId = req.body.proId
    const token = req.headers.token
    // 购物车id，用户id，商品数据（数组->对象->商品id+商品数量
    tools.verify(token).then(tokenData=>{
        sql.find(pro,{proId},{}).then(data=>{
            if(data.length > 0){
                // 先读取数据库
                sql.find(cart, {userId}, {}).then(data=>{
                    if(data.length < 1){
                        // 第一次加，直接存数据
                        sql.insert(cart, {
                            userId:userId,
                            cartId:uuid.v1(),
                            proData:[{
                                proId:proId,
                                num:1,
                                time: Date.now(),
                                flag:true
                            }]
                        }).then(()=>{
                            res.send({
                                state:200,
                                title:"第一次插入成功"
                            })
                        })
                    }else{
                        // 非第一次加
                        let arr = data[0].proData
                        // 检查数据
                        let i = 0;
                        let onoff = arr.some((val,idx)=>{
                            i = idx
                            return val.proId === proId
                        })
                        if(onoff){
                            // 重复数据
                            arr[i].num++
                            arr[i].time = Date.now()
                        }else{
                            // 新数据
                            arr.push({
                                proId:proId,
                                num:1,
                                time: Date.now(),
                                flag:true
                            })
                        }
                        sql.update(cart,{userId},{
                            proData:arr
                        }).then(()=>{
                            res.send({
                                state:200,
                                title:"存储成功，更新数据成功"
                            })
                        })
                    }
                })
            }else{
                res.send({
                    state:201,
                    title:"商品不存在"
                })
            }
        })
    }).catch(err=>{
        res.send({
            state:10086,
            title:"登录信息已失效，请重新登录"
        })
    })
});


/**
* @apiGroup 购物车
* @api {post} /api/cart/updateNum 修改购物车中商品的数量
* @apiVersion 0.0.0
* @apiDescription 根据用户id 和 商品id 和 数量，修改购物车中商品的数量
* @apiParam {String} userId 要修改的购物车的用户Id
* @apiParam {String} proId 要修改的购物车的商品的Id
* @apiParam {Number} num 要修改的购物车的商品的数量
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    state:200,
    title:"修改数量成功"
})
res.send({
    state: 10086,
    title: "登录信息已失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart/updateNum
*/

// 修改购物车中商品的数量
router.post('/updateNum', function(req, res, next) {
    const token = req.headers.token;
    const {userId, proId, num} = req.body;

    tools.verify(token).then(tokenData => {
        sql.find(cart, {userId}).then(data=>{
            // data:
            // [{
            //     cartId:"",
            //     userId:"",
            //     proData:[{},{},...]
            // }]
            let arr = data[0].proData
            // arr:
            // [{
            //     proId:"",
            //     num:1,
            //     time:87236478638719
            // },{
            // },...]
            let i = 0
            arr.some((val,idx) => {
                i = idx;
                return val.proId === proId
            });
            arr[i].num = num - 0;
            
            sql.update(cart, { userId }, {
                proData: arr
            }).then(()=>{
                res.send({
                    state:200,
                    title:"修改数量成功"
                })
            })
        })
    }).catch((err)=>{
        res.send({
            state: 10086,
            title: "登录信息已失效，请重新登录",
            data: err
        })
    })
});

/**
* @apiGroup 购物车
* @api {post} /api/cart/del 删除购物车数据
* @apiVersion 0.0.0
* @apiDescription 根据用户id 和 商品id，删除购物车数据
* @apiParam {String} userId 要查询的用户Id
* @apiParam {String} proId 要删除的商品的id
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccessExample {json} Success-Response:
res.send({
    state:200,
    title:"删除成功"
})
res.send({
    state: 10086,
    title: "登录信息已失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart/del
*/

// 删除购物车数据
router.post('/del', function(req, res, next) {
    const {userId, proId} = req.body;
    const token = req.headers.token;

    tools.verify(token).then(tokenData => {
        sql.find(cart, {userId}).then(data=>{
            let arr = data[0].proData
            let i = 0
            arr.some((val,idx) => {
                i = idx;
                return val.proId === proId
            });
            arr.splice(i ,1)
            
            sql.update(cart, { userId }, {
                proData: arr
            }).then(()=>{
                res.send({
                    state:200,
                    title:"删除成功"
                })
            })
        })
    }).catch((err)=>{
        res.send({
            state: 10086,
            title: "登录信息已失效，请重新登录",
            data: err
        })
    })
});


/**
* @apiGroup 购物车
* @api {post} /api/cart/updateFlag 修改购物车中商品的选中状态
* @apiVersion 0.0.0
* @apiDescription 根据用户id 和 商品id 和 状态，修改购物车中商品的选中状态
* @apiParam {String} userId 要修改的购物车的用户Id
* @apiParam {String} proId 要修改的购物车的商品的Id
* @apiParam {Boolean} flag 要修改的购物车的商品的状态
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    state:200,
    title:"修改状态成功"
})
res.send({
    state: 10086,
    title: "登录信息已失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart/updateFlag
*/

// 修改购物车中商品的数量
router.post('/updateFlag', function(req, res, next) {
    const token = req.headers.token;

    const {userId, proId, flag} = req.body;

    tools.verify(token).then(tokenData => {
        sql.find(cart, {userId}).then(data=>{
            let arr = data[0].proData
            let i = 0
            arr.some((val,idx) => {
                i = idx;
                return val.proId === proId
            });
            arr[i].flag = flag;
            
            sql.update(cart, { userId }, {
                proData: arr
            }).then(()=>{
                res.send({
                    state:200,
                    title:"修改状态成功"
                })
            })
        })
    }).catch((err)=>{
        res.send({
            state: 10086,
            title: "登录信息已失效，请重新登录",
            data: err
        })
    })
});


/**
* @apiGroup 购物车
* @api {post} /api/cart/updateAllFlag 修改购物车中所有商品的选中状态
* @apiVersion 0.0.0
* @apiDescription 根据用户id 和 状态，修改购物车中所有商品的选中状态
* @apiParam {String} userId 要修改的购物车的用户Id
* @apiParam {Boolean} flag 要修改的购物车的商品的状态
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    state:200,
    title:"修改状态成功"
})
res.send({
    state: 10086,
    title: "登录信息已失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart/updateAllFlag
*/

// 修改购物车中商品的数量
router.post('/updateAllFlag', function(req, res, next) {
    const token = req.headers.token;

    const {userId, flag} = req.body;

    tools.verify(token).then(tokenData => {
        sql.find(cart, {userId}).then(data=>{
            let arr = data[0].proData
            
            for(let i=0;i<arr.length;i++){
                arr[i].flag = flag;
            }
            
            sql.update(cart, { userId }, {
                proData: arr
            }).then(()=>{
                res.send({
                    state:200,
                    title:"修改状态成功"
                })
            })
        })
    }).catch((err)=>{
        res.send({
            state: 10086,
            title: "登录信息已失效，请重新登录",
            data: err
        })
    })
});


module.exports = router;
